/**
 * 基于 axios 封装的请求模块
 */
import axios from 'axios'
import store from '../store/index'
import router from '../router/index'

// 创建 axios 实例
const instance = axios.create({
  // 请求超过 5 秒即超时返回错误
  timeout: 2000,
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  baseURL: 'http://localhost:3000'
})

// request 拦截器，每次发送请求的时候拦截下来
instance.interceptors.request.use(
  config => {
    // 判断是否存在 token, 如果存在的话，则每个 http header 都加上 token
    if (store.state.token) {
      config.headers.Authorization = `token ${store.state.token}`
    }
    return config
  }
)

// response 拦截器
instance.interceptors.response.use(
  response => {
    return response
  },
  error => {
    // 除了 200 以外的请求到这里来，这里的 200 不是我们设置的那个 code 200，我这里是，没有登录才不会返回 200 
    if (error.response) {
      switch (error.response.status) {
        case 401:
        router.replace({
          // 跳转到登录页面
          path: 'login',
          // 添加一个重定向后缀，等登录以后再到这里来 (验证成功跳转正确页面；失败则跳到登录页，将目标地址附在 url 的 query 里，登录成功就跳转到目标地址)
          query: { redirect: router.currentRoute.fullPath }
        })
      }
    }
    return Promise.reject(error.response)
  }
)

export default instance



// 谁使用就加载 request 模块
// import request from 'request.js'
// request.xxx
// request({
//   method: ,
//   url: ''
// })

/**
 * 1、之前的使用
 * axios.defaults.baseURL = 'https://api.example.com'
 * 2、可能需求
 * http:127.0.0.1:3000/
 * http://localhost:3000/
 * 3、复制一个 axios,不同的 axios 实例可以有不同的配置，而且不会相互冲突
 *    复制出来的 axios 和 axios 本身的功能是一模一样的
 *  例如：
 *  (1) 第一种写法
 *  const req1 = axios.create()
 *  req1.defaults.baseURL = 'http:127.0.0.1:3000/'
 *  
 *  const req2 = axios.create()
 *  req2.defaults.baseURL = 'http://localhost:3000/'
 *  (2) 第二种写法
 *  const request = axios.create({
 *    baseURL: 'http://localhost:3000' //请求的基础路径
 *  })
 * 4、请求方式
 * (1) 
 *    req1({
 *      method: 'GET'，
 *      url: 'xxx'
 *    })
 * (2)
 *    req1.get('xxx')
 */

/**
 * 全局设置
 */
